package com.kexio.security.service;

import java.util.List;
import java.util.Optional;

import com.kexio.common.dto.PageRequest;
import com.kexio.common.dto.PageResponse;
import com.kexio.security.domain.Permission;

/**
 * 权限数据访问接口
 * 
 * @author kexio
 */
public interface PermissionRepository {

    /**
     * 保存权限
     * @param permission 权限实体
     * @return 保存后的权限实体
     */
    Permission save(Permission permission);

    /**
     * 根据ID查找权限
     * @param id 权限ID
     * @return 权限实体
     */
    Optional<Permission> findById(Long id);

    /**
     * 根据权限编码查找权限
     * @param permissionCode 权限编码
     * @return 权限实体
     */
    Optional<Permission> findByPermissionCode(String permissionCode);

    /**
     * 根据权限名称查找权限
     * @param permissionName 权限名称
     * @return 权限实体
     */
    Optional<Permission> findByPermissionName(String permissionName);

    /**
     * 检查权限编码是否存在
     * @param permissionCode 权限编码
     * @param excludeId 排除的权限ID
     * @return 是否存在
     */
    boolean existsByPermissionCode(String permissionCode, Long excludeId);

    /**
     * 检查权限名称是否存在
     * @param permissionName 权限名称
     * @param excludeId 排除的权限ID
     * @return 是否存在
     */
    boolean existsByPermissionName(String permissionName, Long excludeId);

    /**
     * 查找所有权限
     * @return 权限列表
     */
    List<Permission> findAll();

    /**
     * 分页查询权限
     * @param permissionName 权限名称（模糊查询）
     * @param permissionType 权限类型
     * @param status 状态
     * @param pageRequest 分页请求
     * @return 分页结果
     */
    PageResponse<Permission> findPage(String permissionName, Integer permissionType, Integer status, PageRequest pageRequest);

    /**
     * 根据状态查找权限列表
     * @param status 状态
     * @return 权限列表
     */
    List<Permission> findByStatus(Integer status);

    /**
     * 根据权限类型查找权限列表
     * @param permissionType 权限类型
     * @return 权限列表
     */
    List<Permission> findByPermissionType(Integer permissionType);

    /**
     * 根据父权限ID查找子权限列表
     * @param parentId 父权限ID
     * @return 权限列表
     */
    List<Permission> findByParentId(Long parentId);

    /**
     * 根据用户ID查找权限列表
     * @param userId 用户ID
     * @return 权限列表
     */
    List<Permission> findByUserId(Long userId);

    /**
     * 根据角色ID查找权限列表
     * @param roleId 角色ID
     * @return 权限列表
     */
    List<Permission> findByRoleId(Long roleId);

    /**
     * 删除权限
     * @param id 权限ID
     * @return 删除记录数
     */
    int deleteById(Long id);

    /**
     * 批量删除权限
     * @param ids 权限ID列表
     * @return 删除记录数
     */
    int deleteByIds(List<Long> ids);

    /**
     * 统计权限总数
     * @return 权限总数
     */
    long count();
}
